//package com.wanlian.socketserver.Device.worker;
//
//import com.wanlian.entity.Device;
//import com.wanlian.entity.DeviceData;
//import com.wanlian.json.JsonStringUtil;
//import com.wanlian.model.ResultModel;
//import com.wanlian.netty.model.Address;
//import com.wanlian.netty.model.ChannelInfo;
//import com.wanlian.socketserver.Device.DeviceOnlineChecker;
//import com.wanlian.util.DateUtil;
//import com.wanlian.util.HttpUtils;
//import com.wanlian.util.PostQueue;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.TimeUnit;
//
///**
// * 设备在线判断
// */
//public class DeviceOnlineWorker {
//
//
//    public static Map<String, DeviceData> srcDeviceDataMap = new HashMap<>();
//
//    /**
//     * 定时获取所有路由器共享设置
//     */
//    public static void work() {
//        getAllDeviceOnlineData();
//        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
//        for (int i = 0; i < 10; i++) {
//            fixedThreadPool.execute(new Runnable() {
//                public void run() {
//                    while (true) {
//                        try {
//                            TimeUnit.MILLISECONDS.sleep(1000);
//                            processOnlineRouter();
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//            });
//        }
//    }
//
//    private static synchronized void processOnlineRouter() {
//        try {
//            Map<String, String> needToRemoveMap = new HashMap<>();
//            Map<String, Integer> needToRefrushMap = new HashMap<>();
//            Map<String, String> maps = DeviceServerWorker.sessionPool.copyMap();
//            for (String key : maps.keySet()) {
//                if (DeviceServerWorker.sessionPool.publicKeyChannelMap.containsKey(key)) {
//                    ChannelInfo channelInfo = DeviceServerWorker.sessionPool.publicKeyChannelMap.get(key);
//                    long timeSpan = DateUtil.currentTimestamp().getTime() - channelInfo.getLastConnectTime().getTime();
//                    if (!DateUtil.isSameDay(channelInfo.getFirstTime(), DateUtil.currentDateTimestamp())) {
//                        channelInfo.setFirstTime(DateUtil.currentTimestamp());
//                    }
//                    long timeSecond = (DateUtil.currentTimestamp().getTime() - channelInfo.getFirstTime().getTime()) / 1000;
//                    calRouterTime(key, (int) timeSecond);
//                    if (timeSpan > 5 * 1000) {
//                        System.out.println("current:" + DateUtil.currentDatetime() + " last:" + DateUtil.getTimeByTimestamp(channelInfo.getLastConnectTime()));
//                        needToRemoveMap.put(key, key);
//                    } else {
//                        int totalSecond = srcDeviceDataMap.get(key).getOnlineTime();
//                        needToRefrushMap.put(key, totalSecond);
//                    }
//                }
//            }
//            processOnline(needToRefrushMap);
//            processOffline(needToRemoveMap);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    private static synchronized void processOnline(Map<String, Integer> needToRefrushMap) {
//        Map<String, Address> routers = DeviceServerWorker.sessionPool.getAllRouter();
//        List<Device> deviceOnlines = new ArrayList<>();
//        if (needToRefrushMap.size() > 0) {
//            for (String key : needToRefrushMap.keySet()) {
//                Device device = new Device();
//                device.setDevicekey(key);
//                if (routers.containsKey(key)) {
//                    device.setVersion(routers.get(key).getVersion());
//                    deviceOnlines.add(device);
//                }
//            }
//            if (deviceOnlines.size() > 0) {
//                refrushPeersTime(needToRefrushMap);
//                DeviceOnlineChecker.setOnline(deviceOnlines);
//            }
//        }
//    }
//
//    private static synchronized void processOffline(Map<String, String> needToRemoveMap) {
//        Map<String, Address> routers = DeviceServerWorker.sessionPool.getAllRouter();
//        List<Device> devices = new ArrayList<>();
//        if (needToRemoveMap.size() > 0) {
//            for (String key : needToRemoveMap.keySet()) {
//                Device device = new Device();
//                device.setDevicekey(key);
//                if (routers.containsKey(key)) {
//                    device.setVersion(routers.get(key).getVersion());
//                    devices.add(device);
//                }
//            }
//            if (devices.size() > 0) {
//                DeviceOnlineChecker.setOffline(devices);
//            }
//            DeviceServerWorker.sessionPool.removeSessionByMap(needToRemoveMap);
//        }
//    }
//
//
//    public static void getAllDeviceOnlineData() {
//        try {
//            String url = "http://localhost:8080/wanlian.candy/devicedata/all/today";
//            String data = HttpUtils.sendPost(url, "");
//            ResultModel resultModel = JsonStringUtil.readValue(data, ResultModel.class);
//            if (resultModel.getObject() != null) {
//                data = (String) resultModel.getObject();
//                List<DeviceData> list = JsonStringUtil.readValueByList(data, DeviceData.class);
//                for (DeviceData item : list) {
//                    if (!srcDeviceDataMap.containsKey(item.getDeviceKey())) {
//                        srcDeviceDataMap.put(item.getDeviceKey(), item);
//                    }
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//
//    /**
//     * 保存延时方法
//     *
//     * @param key
//     */
//    private static void calRouterTime(String key, int second) {
//        if (srcDeviceDataMap.containsKey(key)) {
//            DeviceData deviceData = srcDeviceDataMap.get(key);
//            if (!DateUtil.isSameDay(deviceData.getModifyTime(), DateUtil.currentDateTimestamp())) {
//                deviceData.setOnlineTime(0);
//                deviceData.setModifyTime(DateUtil.currentDateTimestamp());
//            } else {
//                deviceData.setOnlineTime(second);
//                System.out.println(JsonStringUtil.writeValueAsString(deviceData));
//            }
//        } else {
//            DeviceData deviceData = new DeviceData();
//            deviceData.setDeviceKey(key);
//            deviceData.setModifyTime(DateUtil.currentDateTimestamp());
//            deviceData.setOnlineTime(second);
//            srcDeviceDataMap.put(key, deviceData);
//        }
//    }
//
//    private static void refrushPeersTime(Map<String, Integer> peerTimes) {
//        List<DeviceData> deviceDataList = new ArrayList<>();
//        for (String key : peerTimes.keySet()) {
//            DeviceData deviceData = new DeviceData();
//            deviceData.setDeviceKey(key);
//            deviceData.setModifyTime(DateUtil.currentDateTimestamp());
//            deviceData.setMaxBw(5);
//            deviceData.setOnlineTime(peerTimes.get(key));
//            deviceDataList.add(deviceData);
//        }
//        if (deviceDataList.size() > 0) {
//            String url = "http://localhost:8080/wanlian.candy/devicedata/add/list";
//            PostQueue.add(url, JsonStringUtil.writeValueAsString(deviceDataList));
//        }
//    }
//}
